package com.alfy.websocketdemo;

import javax.websocket.HandshakeResponse;
import javax.websocket.server.HandshakeRequest;
import javax.websocket.server.ServerEndpointConfig;
import java.util.List;
import java.util.Map;

/**
 * 自定 Configurator 配置
 */
public class CustomConfigurator extends ServerEndpointConfig.Configurator {

    /**
     * 在容器制定由格式正确的握手请求生成的握手响应后由容器调用。
     * 容器已检查此配置是否具有匹配的 URI，使用 checkOrigin 方法确定源的有效性，并根据此配置填写协商的子协议和扩展。
     * 自定义配置可能会覆盖此方法，以便检查请求参数并修改服务器制定的握手响应。以及 URI 检查。
     * 如果开发人员未重写此方法，则实现不会对请求和响应进行进一步修改。
     *
     * @param sec      握手中涉及的配置对象
     * @param request  开场握手请求
     * @param response 建议的开场握手响应
     */
    @Override
    public void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request, HandshakeResponse response) {
        System.out.println("CustomConfigurator ==> 进入方法");
        // 获取请求头
        Map<String, List<String>> parameterMap = request.getParameterMap();
        List<String> authorization = parameterMap.get("auth");
        if (authorization != null && !authorization.isEmpty()) {
            String authToken = authorization.get(0);
            // 在这里实现令牌验证逻辑
            if ("valid-token".equals(authToken)) {
                // 验证成功，继续握手
                System.out.println("CustomConfigurator ==> 验证成功，继续握手");
                return;
            }
        }
        // 验证失败，拒绝握手
        System.out.println("CustomConfigurator ==> 验证失败，拒绝握手");
        throw new SecurityException("Authentication failed");
    }

}
